home *** CD-ROM | disk | FTP | other *** search
- ;
- ; grafix --- egagrafa.asm
- ;
- ; stuff to plot points fast in 8086 assembler (BLEECH!!!)
- ;
- ; Written 4/87 by Scott Snyder (ssnyder@romeo.caltech.edu or @citromeo.bitnet)
- ;
- ; Modified 5/29/87 by sss to allow for different memory models
- ;
-
- title egagrafa
-
- include macros.ah
-
- sseg
- endss
-
- g_linsiz equ 80
- g_pixbyte equ 8
- ega_gr_data equ 03cfh
-
- dseg
-
- ex g_drawbuf, dword
- ex g_xor, word
- ex g_xcliplo, word
- ex g_xcliphi, word
- ex g_ycliplo, word
- ex g_ycliphi, word
-
- endds
-
- exProc EGA_point_set
- exProc EGA_point_res
-
- cseg _egagrafa
-
- EGA_plot label byte ; to get accurate profiling data
-
- ; plot a point. ax = y; bl = c; cx = x;
-
- pBegin plot
-
- les si, g_drawbuf ; get address of buffer
- mov dx, g_linsiz ; y * g_linsiz
- mul dx
- add si, ax ; add to offset
- mov ax, cx ; x to AC (ohhh... what symmetry!)
- mov cx, g_pixbyte ; move it to use it...
- div cx
- add si, ax ; add quotient to offset (now complete)
- mov al, 80h ; make mask
- mov cx, dx
- shr ax, cl ; shift it
- mov dx, ega_gr_data ; shove it out to the mask register
- out dx, al
- mov al, es:[si] ; read data into latches
- mov es:[si], al ; and do a write
- ret
-
- pEnd plot
-
- ;
- ; C interface for point plotter
- ;
- ; EGA_point(x, y, c)
- ;
-
- pBegin EGA_point
-
- push bp
- mov bp, sp
- push si
- push di
-
- push [bp+argbase+4] ; call setup routine
- call EGA_point_set
- add sp, 2
-
- mov ax, [bp+argbase+2]
- mov bx, [bp+argbase+4]
- mov cx, [bp+argbase]
- call plot
-
- call EGA_point_res ; reset EGA
-
- pop di
- pop si
- mov sp, bp
- pop bp
- ret
-
- pEnd EGA_point
-
- ;
- ; write for pixels for circle drawing
- ;
- ; void EGA_write_pix(x1, y1, x2, y2, c)
- ;
- ; can just ignore color here 'cause that's all setup at setup time...
- ;
-
- pBegin EGA_write_pix
-
- push bp
- mov bp, sp
- push si
- push di
-
- mov cx, [bp+argbase] ; cx = x1
- cmp cx, g_xcliplo ; check for clipping
- jb w2
- cmp cx, g_xcliphi
- ja w2
-
- mov ax, [bp+argbase+2] ; ax = y1
- cmp ax, g_ycliplo ; do clipping
- jb w1
- cmp ax, g_ycliphi
- ja w1
-
- push cx ; plot (x1, y1)
- call plot
- pop cx
-
- w1: mov ax, [bp+argbase+6] ; ax = y2
- cmp ax, g_ycliplo
- jb w2
- cmp ax, g_ycliphi
- ja w2
-
- call plot ; plot (x1, y2)
-
- w2: mov cx, [bp+argbase+4] ; cx = x2
- cmp cx, g_xcliplo
- jb w4
- cmp cx, g_xcliphi
- ja w4
-
- mov ax, [bp+argbase+2] ; ax = y1
- cmp ax, g_ycliplo ; do clipping
- jb w3
- cmp ax, g_ycliphi
- ja w3
-
- push cx ; plot (x2, y1)
- call plot
- pop cx
-
- w3: mov ax, [bp+argbase+6] ; ax = y2
- cmp ax, g_ycliplo
- jb w4
- cmp ax, g_ycliphi
- ja w4
-
- call plot ; plot (x2, y2)
-
- w4: pop di
- pop si
- mov sp, bp
- pop bp
- ret
-
- pEnd EGA_write_pix
-
- df_ EGA_point
- df_ EGA_write_pix
- df_ EGA_plot
-
- endcs _egagrafa
-
- end
-